在Servlet 3.0+的环境中,你可以选择以编码的方式配置Servlet容器或是结合web.xml文件使用。下面是注册DispatcherServlet的例子:

import org.springframework.web.WebApplicationInitializer;

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
        XmlWebApplicationContext appContext = new XmlWebApplicationContext();
        appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");

        ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
        registration.setLoadOnStartup(1);
        registration.addMapping("/");
    }

}

WebApplicationInitializer是一个由Spring MVC提供的接口,用来确保你的视线可以被检测且自动用于初始化Servlet 3的容器。这个接口的抽象实现类AbstractDipatcherServletInitializer可以让注册DispatcherServlet变得简单,只需要覆盖几个方法指定servlet映射和指定DispatcherServlet配置。
建议在应用中使用基于Java的Spring配置:

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { MyWebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}

如果是使用基于XML的配置,你应该直接继承AbstractDispatcherServletInitializer

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }

    @Override
    protected WebApplicationContext createServletApplicationContext() {
        XmlWebApplicationContext cxt = new XmlWebApplicationContext();
        cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
        return cxt;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}

AbstractDispatcherServletInitializer也提供便捷的方法来添加Filter实例并让他们自动映射到DispatcherServlet

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    // ...

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] { new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
    }

}

每个过滤器都会根据它的具体类型添加一个默认名称,并自动映射到DispatcherServlet
AbstractDispatcherServletInitializer的protected方法isAsyncSupported提供了一个为DispatcherServlet和映射它的所有过滤器设置异步支持的地方。这个标志默认被设为true
最后,如果你想要更深度的自定义DispathcerServlet,你可以覆盖createDispathcerServlet方法。